﻿using System;
using WebPic.Sample.Comum;
using WebPic.Sample.Modelo.Entidades;
using WebPic.Sample.Modelo.Repositorios;
using WebPic.Sample.Modelo.Repositorios.Interfaces;
using WebPic.Sample.Comum;
using WebPic.Sample.Modelo.Entidades;

namespace WebPic.Sample.Modelo {
    public class UnitOfWork : IUnitOfWork {
        private SampleContext _context;

        private IRepositoryProduto _repositorioProduto;
        public IRepositoryProduto Produto {
            get { return _repositorioProduto ?? (_repositorioProduto = new RepositoryProduto(_context)); }
        }

        private IRepository<PessoaContato> _repositorioPessoaContato;
        public IRepository<PessoaContato> PessoaContato
        {
            get { return _repositorioPessoaContato ?? (_repositorioPessoaContato = new Repository<PessoaContato>(_context)); }
        }

        private IRepository<PessoaEndereco> _repositorioPessoaEndereco;
        public IRepository<PessoaEndereco> PessoaEndereco
        {
            get { return _repositorioPessoaEndereco ?? (_repositorioPessoaEndereco = new Repository<PessoaEndereco>(_context)); }
        }

        private IRepository<Cliente> _repositorioCliente;
        public IRepository<Cliente> Cliente
        {
            get { return _repositorioCliente ?? (_repositorioCliente = new Repository<Cliente>(_context)); }
        }

        private IRepository<Vendedor> _repositorioVendedor;
        public IRepository<Vendedor> Vendedor
        {
            get { return _repositorioVendedor ?? (_repositorioVendedor = new Repository<Vendedor>(_context)); }
        }

        private IRepositoryFornecedor _repositorioFornecedor;
        public IRepositoryFornecedor Fornecedor
        {
            get { return _repositorioFornecedor ?? (_repositorioFornecedor = new RepositoryFornecedor(_context)); }
        }

        private IRepositoryRepresentante _repositorioRepresentante;
        public IRepositoryRepresentante Representante
        {
            get { return _repositorioRepresentante ?? (_repositorioRepresentante = new RepositoryRepresentante(_context))}
        }

        private IRepository<Cidade> _repositorioCidade;
        public IRepository<Cidade> Cidade
        {
            get { return _repositorioCidade ?? (_repositorioCidade = new Repository<Cidade>(_context)); }
        }

        public UnitOfWork() {
            _context = new SampleContext();
        }

        public void Dispose() {
            Dispose(true);
            GC.SuppressFinalize(this);
        }

        protected virtual void Dispose(bool disposing) {
            if (!disposing) return;
            if (_context == null) return;
            _context.Dispose();
            _context = null;
        }
    }
}